package com.doitedu.day01

/**
 * @Date 22.6.19
 * @Created by HANGGE
 * @Description
 *  方法是功能的封装  处理数据
 *  函数是功能的封装  处理数据   优先使用
 *  确定:  输入数据类型  处理逻辑  返回值类型(自动推导)
 *  函数的签名
 *  类名.函数名:函数类型
 *  f函数名
 *  :(Int,Int)=>Int 函数类型
 *  val f:(Int,Int)=>Int =  (x:Int , y:Int)=>{x+y}
 */
object _08函数式编程 {

  def opt1(x:Int,y:Int)={
    x+y
  }

  def opt2(x:Int,y:Int)={
    if (x>y) x else  y
  }


  def opt3(x:Int,y:Int)={
    x*y
  }

  /**
   * 参数1 2  要处理的数据
   * 参数3  处理数据的逻辑  函数代表逻辑
   */
  def opt(x:Int,y:Int , f:(Int,Int)=>Int) ={
    f(x,y)
  }

  val add = (x:Int , y:Int)=>{
    x+y
  }

  val mut = (x:Int , y:Int)=>{
    x*y
  }


  val max = (x:Int , y:Int)=>{
    if (x>y) x else  y
  }

  def main(args: Array[String]): Unit = {
    // 函数可以作为参数传递
    // 调用同一个方法  接受不同的函数  处理数据的逻辑不一样
    println(opt(2, 3, mut))
    // 匿名函数
    println(opt(2, 3, (x: Int, y: Int) => x * y))

    /**
     * def opt(x:Int,y:Int , f:(Int,Int)=>Int) ={
     * f(x,y)
     * }
     */
   // opt(2,3 ,(x:Int,y:Int)=>x+y)
    opt(2,3 ,(x,y)=>x+y)
  }
}
